home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / sbin / grub-install < prev    next >
Text File  |  2009-10-29  |  10KB  |  341 lines

  1. #! /bin/sh
  2.  
  3. # Install GRUB on your drive.
  4. # Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009  Free Software Foundation, Inc.
  5. #
  6. # GRUB is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation, either version 3 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # GRUB is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  18.  
  19. # Initialize some variables.
  20. transform="s,x,x,"
  21.  
  22. prefix=/usr
  23. exec_prefix=${prefix}
  24. sbindir=${exec_prefix}/sbin
  25. bindir=${exec_prefix}/bin
  26. libdir=${exec_prefix}/lib
  27. PACKAGE_NAME=GRUB
  28. PACKAGE_TARNAME=grub
  29. PACKAGE_VERSION=1.97~beta4
  30. target_cpu=i386
  31. platform=pc
  32. pkglibdir=${libdir}/`echo ${PACKAGE_TARNAME}/${target_cpu}-${platform} | sed ${transform}`
  33.  
  34. # for make_system_path_relative_to_its_root()
  35. . ${libdir}/grub/grub-mkconfig_lib
  36.  
  37. grub_setup=${sbindir}/`echo grub-setup | sed ${transform}`
  38. if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
  39.     grub_mkimage=${bindir}/`echo grub-mkimage | sed ${transform}`
  40. else
  41.     grub_mkimage=${bindir}/`echo grub-mkelfimage | sed ${transform}`
  42. fi
  43. grub_mkdevicemap=${sbindir}/`echo grub-mkdevicemap | sed ${transform}`
  44. grub_probe=${sbindir}/`echo grub-probe | sed ${transform}`
  45. grub_editenv=${bindir}/`echo grub-editenv | sed ${transform}`
  46. rootdir=
  47. grub_prefix=`echo /boot/grub | sed ${transform}`
  48. modules=
  49.  
  50. install_device=
  51. no_floppy=
  52. force_lba=
  53. recheck=no
  54. debug=no
  55.  
  56. if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
  57.     disk_module=biosdisk
  58. else
  59.     disk_module=ata
  60. fi
  61.  
  62. # Usage: usage
  63. # Print the usage.
  64. usage () {
  65.     cat <<EOF
  66. Usage: grub-install [OPTION] install_device
  67. Install GRUB on your drive.
  68.  
  69.   -h, --help              print this message and exit
  70.   -v, --version           print the version information and exit
  71.   --modules=MODULES       pre-load specified modules MODULES
  72.   --root-directory=DIR    install GRUB images under the directory DIR
  73.                           instead of the root directory
  74.   --grub-setup=FILE       use FILE as grub-setup
  75.   --grub-mkimage=FILE     use FILE as grub-mkimage
  76.   --grub-mkdevicemap=FILE use FILE as grub-mkdevicemap
  77.   --grub-probe=FILE       use FILE as grub-probe
  78.   --no-floppy             do not probe any floppy drive
  79.   --recheck               probe a device map even if it already exists
  80.   --force                 install even if problems are detected
  81. EOF
  82. if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
  83.     cat <<EOF
  84.   --disk-module=MODULE    disk module to use
  85. EOF
  86. fi
  87.     cat <<EOF
  88.  
  89. INSTALL_DEVICE can be a GRUB device name or a system device filename.
  90.  
  91. grub-install copies GRUB images into the DIR/boot directory specified by
  92. --root-directory, and uses grub-setup to install grub into the boot
  93. sector.
  94.  
  95. Report bugs to <bug-grub@gnu.org>.
  96. EOF
  97. }
  98.  
  99. # Check the arguments.
  100. for option in "$@"; do
  101.     case "$option" in
  102.     -h | --help)
  103.     usage
  104.     exit 0 ;;
  105.     -v | --version)
  106.     echo "grub-install (GNU GRUB ${PACKAGE_VERSION})"
  107.     exit 0 ;;
  108.     --modules=*)
  109.     modules=`echo "$option" | sed 's/--modules=//'` ;;
  110.     --root-directory=*)
  111.     rootdir=`echo "$option" | sed 's/--root-directory=//'` ;;
  112.     --grub-setup=*)
  113.     grub_setup=`echo "$option" | sed 's/--grub-setup=//'` ;;
  114.     --grub-mkimage=*)
  115.     grub_mkimage=`echo "$option" | sed 's/--grub-mkimage=//'` ;;
  116.     --grub-mkdevicemap=*)
  117.     grub_mkdevicemap=`echo "$option" | sed 's/--grub-mkdevicemap=//'` ;;
  118.     --grub-probe=*)
  119.     grub_probe=`echo "$option" | sed 's/--grub-probe=//'` ;;
  120.     --no-floppy)
  121.     no_floppy="--no-floppy" ;;
  122.     --recheck)
  123.     recheck=yes ;;
  124.     --disk-module=*)
  125.     if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
  126.            disk_module=`echo "$option" | sed 's/--disk-module=//'`
  127.         fi ;;
  128.     # This is an undocumented feature...
  129.     --debug)
  130.     debug=yes ;;
  131.     -f | --force)
  132.         setup_force="--force" ;;
  133.     -*)
  134.     echo "Unrecognized option \`$option'" 1>&2
  135.     usage
  136.     exit 1
  137.     ;;
  138.     *)
  139.     if test "x$install_device" != x; then
  140.         echo "More than one install_devices?" 1>&2
  141.         usage
  142.         exit 1
  143.     fi
  144.     install_device="${option}" ;;
  145.     esac
  146. done
  147.  
  148. # added by debian patch
  149. setup_force="--force"
  150.  
  151. if test "x$install_device" = x; then
  152.     echo "install_device not specified." 1>&2
  153.     usage
  154.     exit 1
  155. fi
  156.  
  157. # If the debugging feature is enabled, print commands.
  158. setup_verbose=
  159. if test $debug = yes; then
  160.     set -x
  161.     setup_verbose="--verbose"
  162. fi
  163.  
  164. # Initialize these directories here, since ROOTDIR was initialized.
  165. case "$host_os" in
  166. netbsd* | openbsd*)
  167.     # Because /boot is used for the boot block in NetBSD and OpenBSD, use /grub
  168.     # instead of /boot/grub.
  169.     grub_prefix=`echo /grub | sed ${transform}`
  170.     bootdir=${rootdir}
  171.     ;;
  172. *)
  173.     # Use /boot/grub by default.
  174.     bootdir=${rootdir}/boot
  175.     ;;
  176. esac
  177.  
  178. grubdir=${bootdir}/`echo grub | sed ${transform}`
  179. device_map=${grubdir}/device.map
  180.  
  181. grub_probe="${grub_probe} --device-map=${device_map}"
  182.  
  183. # Check if GRUB is installed.
  184. if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
  185.     set $grub_setup dummy
  186.     if test -f "$1"; then
  187.         :
  188.     else
  189.         echo "$1: Not found." 1>&2
  190.         exit 1
  191.     fi
  192. fi
  193.  
  194. set $grub_mkimage dummy
  195. if test -f "$1"; then
  196.     :
  197. else
  198.     echo "$1: Not found." 1>&2
  199.     exit 1
  200. fi
  201.  
  202. set $grub_mkdevicemap dummy
  203. if test -f "$1"; then
  204.     :
  205. else
  206.     echo "$1: Not found." 1>&2
  207.     exit 1
  208. fi
  209.  
  210. # Create the GRUB directory if it is not present.
  211. test -d "$bootdir" || mkdir "$bootdir" || exit 1
  212. test -d "$grubdir" || mkdir "$grubdir" || exit 1
  213.  
  214. # If --recheck is specified, remove the device map, if present.
  215. if test $recheck = yes; then
  216.     rm -f $device_map
  217. fi
  218.  
  219. # Create the device map file if it is not present.
  220. if test -f "$device_map"; then
  221.     :
  222. else
  223.     # Create a safe temporary file.
  224.     test -n "$mklog" && log_file=`$mklog`
  225.  
  226.     $grub_mkdevicemap --device-map=$device_map $no_floppy || exit 1
  227. fi
  228.  
  229. # Make sure that there is no duplicated entry.
  230. tmp=`sed -n '/^([fh]d[0-9]*)/s/\(^(.*)\).*/\1/p' $device_map \
  231.     | sort | uniq -d | sed -n 1p`
  232. if test -n "$tmp"; then
  233.     echo "The drive $tmp is defined multiple times in the device map $device_map" 1>&2
  234.     exit 1
  235. fi
  236.  
  237. # Copy the GRUB images to the GRUB directory.
  238. for file in ${grubdir}/*.mod ${grubdir}/*.lst ${grubdir}/*.img ${grubdir}/efiemu??.o; do
  239.     if test -f $file && [ "`basename $file`" != menu.lst ]; then
  240.     rm -f $file || exit 1
  241.     fi
  242. done
  243. for file in ${pkglibdir}/*.mod ${pkglibdir}/*.lst; do
  244.     cp -f $file ${grubdir} || exit 1
  245. done
  246. if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
  247.     for file in ${pkglibdir}/*.img ${pkglibdir}/efiemu??.o; do
  248.     if test -f $file; then
  249.         cp -f $file ${grubdir} || exit 1
  250.     fi
  251.     done
  252. fi
  253.  
  254. if ! test -f ${grubdir}/grubenv; then
  255.     $grub_editenv ${grubdir}/grubenv create
  256. fi
  257.  
  258. # Write device to a variable so we don't have to traverse /dev every time.
  259. grub_device=`$grub_probe --target=device ${grubdir}`
  260.  
  261. # Create the core image. First, auto-detect the filesystem module.
  262. fs_module=`$grub_probe --target=fs --device ${grub_device}`
  263. if test "x$fs_module" = x -a "x$modules" = x; then
  264.     echo "Auto-detection of a filesystem module failed." 1>&2
  265.     echo "Please specify the module with the option \`--modules' explicitly." 1>&2
  266.     exit 1
  267. fi
  268.  
  269. # Then the partition map module.  In order to support partition-less media,
  270. # this command is allowed to fail (--target=fs already grants us that the
  271. # filesystem will be accessible).
  272. partmap_module=`$grub_probe --target=partmap --device ${grub_device} 2> /dev/null`
  273.  
  274. # Device abstraction module, if any (lvm, raid).
  275. devabstraction_module=`$grub_probe --target=abstraction --device ${grub_device}`
  276.  
  277. # The order in this list is critical.  Be careful when modifying it.
  278. modules="$modules $disk_module"
  279. modules="$modules $fs_module $partmap_module $devabstraction_module"
  280.  
  281. prefix_drive=
  282. if [ "x${devabstraction_module}" = "x" ] ; then
  283.     if echo "${install_device}" | grep -qx "(.*)" ; then
  284.       install_drive="${install_device}"
  285.     else
  286.       install_drive="`$grub_probe --target=drive --device ${install_device}`"
  287.     fi
  288.     grub_drive="`$grub_probe --target=drive --device ${grub_device}`"
  289.  
  290.     # Strip partition number
  291.     install_drive="`echo ${install_drive} | sed -e s/,[0-9]*[a-z]*//g`"
  292.     grub_drive="`echo ${grub_drive} | sed -e s/,[0-9]*[a-z]*//g`"
  293.     if [ "$disk_module" = ata ] ; then
  294.         # generic method (used on coreboot and ata mod)
  295.         uuid="`$grub_probe --target=fs_uuid --device ${grub_device}`"
  296.         if [ "x${uuid}" = "x" ] ; then
  297.           echo "UUID needed with ata mod, but the filesystem containing ${grubdir} does not support UUIDs." 1>&2
  298.           exit 1
  299.         fi
  300.         prefix_drive="(UUID=${uuid})"
  301.         modules="$modules fs_uuid"
  302.     elif [ "x${grub_drive}" != "x${install_drive}" ] ; then
  303.         uuid="`$grub_probe --target=fs_uuid --device ${grub_device}`"
  304.         if [ "x${uuid}" = "x" ] ; then
  305.           echo "You attempted a cross-disk install, but the filesystem containing ${grubdir} does not support UUIDs." 1>&2
  306.           exit 1
  307.         fi
  308.         prefix_drive="(UUID=${uuid})"
  309.         modules="$modules fs_uuid"
  310.     fi
  311. else
  312.     prefix_drive=`$grub_probe --target=drive --device ${grub_device}`
  313. fi
  314.  
  315. relative_grubdir=`make_system_path_relative_to_its_root ${grubdir}` || exit 1
  316. if [ "x${relative_grubdir}" = "x" ] ; then
  317.     relative_grubdir=/
  318. fi
  319.  
  320. if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
  321.     $grub_mkimage --output=${grubdir}/core.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1
  322.  
  323.     # Now perform the installation.
  324.     $grub_setup ${setup_verbose} ${setup_force} --directory=${grubdir} --device-map=${device_map} \
  325.         ${install_device} || exit 1
  326. else
  327.     $grub_mkimage -d ${pkglibdir} --output=/boot/multiboot.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1
  328. fi
  329.  
  330. # Prompt the user to check if the device map is correct.
  331. echo "Installation finished. No error reported."
  332. echo "This is the contents of the device map $device_map."
  333. echo "Check if this is correct or not. If any of the lines is incorrect,"
  334. echo "fix it and re-run the script \`grub-install'."
  335. echo
  336.  
  337. cat $device_map
  338.  
  339. # Bye.
  340. exit 0
  341.